import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import com.ckjw.gobang.connect.Message;
import com.ckjw.gobang.connect.MessageType;

/*** 
*
*记录单个用户id，并给该用户创建一个线程,处理来自客户端message对象不同类型属性的消息
* @author  李传开 戴俊伟
* @Date    Jun 13, 2022
 */
public class ServerConnectClientThread extends Thread{
    private Socket socket;
    private String userId;//连接到服务端的用户id

    public ServerConnectClientThread(Socket socket, String userId) {
        this.socket = socket;
        this.userId = userId;
    }

    public Socket getSocket() {
        return socket;
    }

    @Override
    public void run() { //这里线程处于run的状态，可以发送/接收消息

        while (true) {
           
            try {
                //System.out.println("服务端和客户端" + userId + " 保持通信，读取数据...");
                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                Message message = (Message) ois.readObject();
                //后面会使用message, 根据message的类型，做相应的业务处理
                if (message.getMesType().equals(MessageType.MESSAGE_COMM_MES)) {//普通消息
                    System.out.println(userId+"向"+message.getGetter()+"发送消息");
                    //根据message获取getter id, 然后在得到对应先线程
                    ServerConnectClientThread serverConnectClientThread =
                            ManageClientThreads.getServerConnectClientThread(message.getGetter());
                    //得到对应socket的对象输出流，将message对象转发给指定的客户端
                    ObjectOutputStream oos =
                            new ObjectOutputStream(serverConnectClientThread.getSocket().getOutputStream());
                    oos.writeObject(message);//转发，想法如果客户不在线，可以保存到数据库，这样就可以实现离线留言

                 } else if (message.getMesType().equals(MessageType.MESSAGE_FILE_MES)) {//发送文件
                    System.out.println(userId+"向"+message.getGetter()+"发送文件");
                    //根据getter id 获取到对应的线程，将message对象转发
                    ObjectOutputStream oos =
                            new ObjectOutputStream(ManageClientThreads.getServerConnectClientThread(message.getGetter()).getSocket().getOutputStream());
                    //转发
                    oos.writeObject(message);
                } else if (message.getMesType().equals(MessageType.MESSAGE_CLIENT_EXIT)) {//客户端退出

                    System.out.println(userId + " 退出");
                    //将这个客户端对应线程，从集合删除.
                    ManageClientThreads.removeServerConnectClientThread(userId);

                    //给所有客户端发送刷新在线列表的信息
                    ManageClientThreads.refresh();
                   
                    socket.close();//关闭连接
                    //退出线程
                    break;
                }
                else if(message.getMesType().equals(MessageType.MESSAGE_GAME))//游戏对战请求
                {
                    String id=message.getGetter();
                    System.out.println(userId+"向"+id+"请求游戏对战");
                    //从hashmap获取对应socket并发送请求
                    Socket tmp= ManageClientThreads.getHm().get(id).getSocket();
                    message.setSender(userId);
                    ObjectOutputStream oos = new ObjectOutputStream(tmp.getOutputStream());
                    oos.writeObject(message);
                
                }
                else if (message.getMesType().equals(MessageType.MESSAGE_GAMRES)) {//请求结果(被挑战方是否同意)

                    String id=message.getGetter();
                    //从hashmap获取对应socket并发送请求
                    Socket tmp= ManageClientThreads.getHm().get(id).getSocket();
                    String res=message.getContent();//0拒绝1接受
                    if (res.equals("1")) {
                        message.setContent("1");
                        System.out.println(userId+"对"+id+"发送"+"接受");
                    }
                    else if(res.equals("2"))
                    {
                        message.setContent("2");
                        System.out.println(userId+"对"+id+"发送"+"正在游戏中");
                    }
                    else{
                        message.setContent("0");
                        System.out.println(userId+"对"+id+"发送"+"拒绝请求");
                    }
                    ObjectOutputStream oos = new ObjectOutputStream(tmp.getOutputStream());
                    oos.writeObject(message);
                   
                }
                else if(message.getMesType().equals(MessageType.MESSAGE_GAMEOVER))
                {
                    String id=message.getGetter();
                    //从hashmap获取对应socket并发送请求
                    Socket tmp= ManageClientThreads.getHm().get(id).getSocket();
                    message.setSender(userId);
                    ObjectOutputStream oos = new ObjectOutputStream(tmp.getOutputStream());
                    oos.writeObject(message);
                }
                 else {
                    System.out.println("其他类型的message , 暂时不处理");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }


    }
}
